#include "BlockQueue.hpp"
#include <iostream>
#include <pthread.h>
#include <unistd.h>

void *consumerRun(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    int data = 0;
    while (true)
    {
        sleep(5);
        // 1. 消费任务
        data = bq->pop();
        // 2. 处理任务 -- 处理任务的时候，这个任务，已经被拿到线程的上下文中了,不属于队列了
        std::cout << "消费了一个任务" << data <<  std::endl;
    }
}

void *producorRun(void *args)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
    int data = 1;
    while (true)
    {
        //sleep(1);
        // 1. 获得任务
        std::cout << "生产了一个任务: " << data << std::endl;

        // 2. 生产任务
        bq->emplace(data++);
    }
}

// test for 单生产消费
int main()
{
    // 创建阻塞队列
    BlockQueue<int>* bq = new BlockQueue<int>();

    // 创建生产者和消费者---线程模拟
    pthread_t consumer, producer;
    pthread_create(&consumer, nullptr, consumerRun, bq);
    pthread_create(&producer, nullptr, producorRun, bq);


    pthread_join(consumer, nullptr);
    pthread_join(producer, nullptr);
    return 0;
}

//int main()
//{
//    // 扩展认识: 阻塞队列: 可以放任务吗？
//    // 申请阻塞队列
//    BlockQueue<task_t> *bq = new BlockQueue<task_t>();
//
//    // 构建生产和消费者
//    pthread_t c[2], p[3];
//
//    pthread_create(c, nullptr, consumer, bq);
//    pthread_create(c+1, nullptr, consumer, bq);
//    pthread_create(p, nullptr, productor, bq);
//    pthread_create(p+1, nullptr, productor, bq);
//    pthread_create(p+2, nullptr, productor, bq);
//
//    pthread_join(c[0], nullptr);
//    pthread_join(c[1], nullptr);
//    pthread_join(p[0], nullptr);
//    pthread_join(p[1], nullptr);
//    pthread_join(p[2], nullptr);
//
//    return 0;
//}